home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asmbler.arc / DDIIL.ASM < prev    next >
Assembly Source File  |  1988-11-19  |  9KB  |  272 lines

  1.  
  2. PUBLIC  DDIIL
  3.  
  4. ASSUME  CS:$DDIIL
  5.  
  6. INCLUDE DOS.INC
  7.  
  8. $DDIIL  SEGMENT PARA PUBLIC 'CODE'
  9.  
  10. COMMENT \ Procedure/Function : DDIIL 
  11.  
  12. PROCEDURE DDISB (MX,MY : integer); EXTERNAL;
  13.  
  14. PROCEDURE DDIIL (IX0,IY0,IX1,IY1 : integer; VISBLE : boolean);
  15. {
  16. (Incremental Line)
  17. Fill in the  steps on  the plot frame  between the  point (IX0,IY0)  and
  18. (IX1,IY1), where IX0, IY0, IX1, and  IY1 are in actual raster units  for
  19. the device being  used.  If a  vector plot  device is to  be used,  this
  20. routine might instead simply transmit a single vector to a buffer.
  21.  
  22. This version uses a symmetric DDA  algorithm due to Van Throng (?).
  23. (25-JAN-84)
  24. }
  25. VAR
  26.         AXIS, AXISX, AXISY, BIAS, DELX, DELY, DIAG, DIAGX, DIAGY, I, IX,
  27.         IY, NDIST, NUMPNT, SX, SY : INTEGER;
  28.  
  29. Here is the Pascal code corresponding to the assembly code below.   Line
  30. number labels  are retained,  but  hand optimization  of the  .COD  file
  31. produced by the IBM Pascal Version 1.00 compiler for the IBM PC with the
  32. debug code  suppressed  has  substantially reduced  the  code  size  and
  33. resulted in some minor rearrangements.
  34.  
  35. L44:    IF VISBLE THEN
  36. L45:            BEGIN
  37. L46:            DELX := IX1 - IX0;
  38. L47:            DELY := IY1 - IY0;
  39. L48:            SX := ABS(DELY);
  40. L49:            SY := ABS(DELX);
  41. L50:            IF DELX >= 0 
  42. L51:                    THEN DIAGX :=  1
  43. L52:                    ELSE DIAGX := -1;
  44. L53:            IF DELY >= 0 
  45. L54:                    THEN DIAGY :=  1
  46. L55:                    ELSE DIAGY := -1;
  47. L56:            IF SY <= SX THEN
  48. L57:                    BEGIN
  49. L58:                    AXISX := 0;
  50. L59:                    AXISY := DIAGY
  51. L60:                    END
  52. L61:            ELSE
  53. L62:                    BEGIN
  54. L63:                    AXISX := DIAGX;
  55. L64:                    AXISY := 0
  56. L65:                    END;
  57. L66:            AXIS := MIN(SX,SY);
  58. L67:            BIAS := MAX(SX,SY);
  59. L68:            DIAG := AXIS - BIAS;
  60. L69:            IF DIAGX < 0
  61. L70:                    THEN NDIST := - BIAS - 2
  62. L71:                    ELSE NDIST := - BIAS - 1;
  63. L72:            NDIST := AXIS + NDIST DIV 2;
  64. L73:            NUMPNT := MAX(SX,SY) + 1;
  65. L74:            IX := IX0;
  66. L75:            IY := IY0;
  67. L76:            FOR I := 1 TO NUMPNT-1 DO
  68. L77:                    BEGIN
  69. L78:                    DDISB (IX,IY);
  70. L79:                    IF NDIST < 0 THEN
  71. L80:                            BEGIN
  72. L81:                            NDIST := NDIST + AXIS;
  73. L82:                            IX := IX + AXISX;
  74. L83:                            IY := IY + AXISY
  75. L84:                            END
  76. L85:                    ELSE
  77. L86:                            BEGIN
  78. L87:                            NDIST := NDIST + DIAG;
  79. L88:                            IX := IX + DIAGX;
  80. L89:                            IY := IY + DIAGY
  81. L90:                            END
  82. L91:                    END;
  83. L92:            DDISB(IX,IY)
  84. L93:            END
  85. L94:    END; { DDIIL } 
  86. \
  87.  
  88. ARGCNT  EQU     5               ; Number of arguments
  89. IX0     EQU     [BP]            ; Define symbolic argument frame offsets
  90. IY0     EQU     [BP-2]
  91. IX1     EQU     [BP-4]
  92. IY1     EQU     [BP-6]
  93. VISBLE  EQU     [BP-8]
  94.                                 ; return address as CS:offset at [BP-10..13]
  95.                                 ; old BP at [BP-14..15]
  96. AXISX   EQU     [BP-16]         ; start of local variables
  97. AXISY   EQU     [BP-18]
  98. BIAS    EQU     [BP-20]
  99. DELX    EQU     [BP-22]
  100. DELY    EQU     [BP-24]
  101. DIAG    EQU     [BP-26]
  102. DIAGX   EQU     [BP-28]
  103. DIAGY   EQU     [BP-30]
  104. I       EQU     [BP-32]
  105. IX      EQU     [BP-34]
  106. IY      EQU     [BP-36]
  107. NDIST   EQU     [BP-38]
  108. NUMPNT  EQU     [BP-40]
  109. SX      EQU     [BP-42]
  110. SY      EQU     [BP-44]
  111. AXIS    EQU     [BP-46]
  112. SPBIAS  EQU     46              ; New SP points at last local stack variable
  113.  
  114.  
  115. DDIIL   PROC    FAR
  116.         PUSH    BP              ; Save caller's frame pointer
  117.         MOV     BP,SP           ; and set up our own.
  118.         ADD     BP,4+2*ARGCNT   ; Point to top of arg list on stack
  119.         SUB     SP,SPBIAS       ; Reserve space for locals on stack
  120.                                 ; (stack overflow not checked for)
  121. L44:    
  122.         MOV     DX,VISBLE
  123.         TEST    DL,DL           ; VISBLE = false?
  124.         JNZ     L46             ; No
  125.         ADD     SP,SPBIAS       ; Yes, restore original SP at entry
  126.         POP     BP              ; and caller's frame pointer
  127.         RET     2*ARGCNT        ; and return discarding stack arguments
  128.  
  129. L46:
  130.         MOV     DX,IX1
  131.         SUB     DX,IX0
  132.         MOV     DELX,DX         ; DELX := IX1 - IX0
  133. L47:
  134.         MOV     DX,IY1
  135.         SUB     DX,IY0
  136.         MOV     DELY,DX         ; DELY := IY1 - IY0
  137. L48:
  138.         MOV     DX,DELY
  139.         MOV     CX,1
  140.         TEST    DX,DX           ; DELY < 0?
  141.         JNS     L48a            ; No
  142.         NEG     DX              ; Yes, make positive
  143.         NEG     CX              ; -1
  144. L48a:
  145.         MOV     SX,DX           ; SX := ABS(DELY)
  146.         MOV     DIAGY,CX        ; DIAGY := SIGN(1,DELY)
  147. L49:
  148.         MOV     DX,DELX
  149.         MOV     CX,1
  150.         TEST    DX,DX           ; DELX < 0?
  151.         JNS     L49a            ; No
  152.         NEG     DX              ; Yes, make positive
  153.         NEG     CX              ; -1
  154. L49a:
  155.         MOV     SY,DX           ; SY := ABS(DELX)
  156.         MOV     DIAGX,CX        ; DIAGX := SIGN(1,DELX)
  157. L50:
  158. L51:
  159. L52:
  160. L53:
  161. L54:
  162. L55:
  163. L56:
  164.         MOV     DX,SY
  165.         CMP     DX,SX           ; SY > SX?
  166.         JG      I12             ; Yes
  167. L58:                            ; No, SY <= SX
  168.         MOV     word ptr AXISX,0000H  ; AXISX := 0
  169. L59:
  170.         MOV     DX,DIAGY
  171.         MOV     AXISY,DX        ; AXISY := DIAGY
  172.         JMP     short I13
  173. I12:                            ; else (SY > SX)
  174. L63:
  175.         MOV     DX,DIAGX
  176.         MOV     AXISX,DX        ; AXISX := DIAGX
  177. L64:
  178.         MOV     word ptr AXISY,0000H    ; AXISY := 0
  179. L65:
  180. I13:
  181. L66:
  182.         MOV     DX,SX
  183.         MOV     CX,SY   
  184.         CMP     DX,CX           ; SX > SY?
  185.         JG      L66a            ; Yes
  186.         MOV     AXIS,DX         ; No, AXIS = min(SX,SY) = SX
  187.         MOV     BIAS,CX         ; and BIAS = max(SX,SY) = SY
  188.         JMP     SHORT L68
  189. L66a:
  190.         MOV     AXIS,CX         ; No, AXIS = min(SX,SY) = SY
  191.         MOV     BIAS,DX         ; and BIAS = max(SX,SY) = SX
  192.                 
  193. L68:
  194.         MOV     DX,AXIS
  195.         SUB     DX,BIAS
  196.         MOV     DIAG,DX         ; DIAG := AXIS - BIAS
  197. L69:
  198.         MOV     DX,BIAS
  199.         NEG     DX              ; -BIAS
  200.         DEC     DX              ; -BIAS-1
  201.         CMP     word ptr DIAGX,0000H    ; DIAGX < 0?
  202.         JGE     I14             ; No
  203. L70:
  204.         DEC     DX              ; Yes, form -BIAS-2
  205. I14:
  206. L71:
  207.         MOV     NDIST,DX        ; NDIST is always negative
  208. L72:
  209.         NEG     DX              ; -NDIST is positive
  210.         SAR     DX,1            ; ((-NDIST) DIV 2)
  211.         NEG     DX              ; (NDIST DIV 2)
  212.         ADD     DX,AXIS         ; (NDIST DIV 2) + AXIS
  213.         MOV     NDIST,DX        ; NDIST := AXIS + NDIST DIV 2
  214. L73:
  215.         MOV     DX,SX
  216.         CMP     DX,SY           ; SX >= SY?
  217.         JGE     L73a            ; Yes
  218.         MOV     DX,SY           ; MAX(SX,SY)
  219. L73a:
  220.         INC     DX              ; MAX(SX,SY) + 1
  221.         MOV     NUMPNT,DX       ; NUMPNT := MAX(SX,SY) + 1
  222.  
  223. ; Allocate IX, IY, I, NDIST to registers CX, DX, SI, and DI, and set
  224. ; video function codes in AH,AL outside of loop
  225.  
  226. L74:
  227.         MOV     CX,IX0          ; IX := IX0
  228. L75:
  229.         MOV     DX,IY0          ; IY := IY0
  230. L76:
  231.         MOV     SI,0001H        ; I := 1
  232.         MOV     DI,NDIST
  233.         MOV     AL,81H          ; want exclusive-OR with current color
  234.         MOV     AH,$VIDEO_SETDOT ; code to set a dot in video map
  235.  
  236. I18:                            ; Start of loop over I
  237.         CMP     SI,NUMPNT       ; I < NUMPNT?
  238.         JGE     I17             ; No, exit loop
  239. L78:
  240.         INT     $VIDEO          ; set the dot 
  241. L79:
  242.         TEST    DI,DI           ; NDIST < 0?
  243.         JGE     I19             ; No
  244. L81:
  245.         ADD     DI,AXIS         ; Yes, NDIST := NDIST + AXIS
  246. L82:
  247.         ADD     CX,AXISX        ; IX := IX +AXISX
  248. L83:
  249.         ADD     DX,AXISY        ; IY := IY + AXISY
  250.         INC     SI              ; I := I + 1 for next iteration
  251.         JMP     short I18       ; Loop back to test limits
  252. I19:
  253. L87:                            ; here when NDIST >= 0
  254.         ADD     DI,DIAG         ; NDIST := NDIST + DIAG
  255. L88:
  256.         ADD     CX,DIAGX        ; IX := IX + DIAGX
  257. L89:
  258.         ADD     DX,DIAGY        ; IY := IY + DIAGY
  259.         INC     SI              ; I := I + 1 for next iteration
  260.         JMP     short I18       ; Loop back to test limits
  261. I17:
  262. L92:                            ; here at loop end to set final dot
  263.         INT     $VIDEO          ; set the dot ((CX,DX) = (IX,IY) = (col,row))
  264.  
  265. I7:                             ; here when done
  266.         ADD     SP,SPBIAS       ; Restore original SP at entry
  267.         POP     BP              ; and caller's frame pointer
  268.         RET     2*ARGCNT        ; and return discarding stack arguments
  269. DDIIL   ENDP
  270. $DDIIL  ENDS
  271.         END
  272.